home *** CD-ROM | disk | FTP | other *** search
- /*****************************************************************************
- *
- * Program Name: jsuper.exe
- *
- * Filename: jsuper.c
- *
- * Date Created: 2/2/89
- *
- * Version: 1.0
- *
- * Programmers: Greg Peto
- *
- * Files used:
- *
- * Date Modified:
- *
- * Modifications:
- *
- * Comments:
- *
- * To locate where global variables are initialized or set, look at
- * ComAndInit for command line settings or for the variables as
- * output variables passed to a function call.
- ****************************************************************************/
-
- /* functions in this file:
- */
- #include "..\genjob.h"
- #include <sys\types.h>
- #include <sys\stat.h>
-
- /* constants definitions */
- #define MAX_MOD_USERS 10 /* max number of user modify specs */
- #define MAX_PATH_NAME 119 /* max directory path name */
- #define MAX_JOBS 20 /* maximum number of jobs will display */
-
- /* global variables and data types */
- #define COM_AUSER 1
- #define COM_AOPER COM_AUSER + 1
- #define COM_ASERVER COM_AOPER + 1
- #define COM_CREATE COM_ASERVER + 1
- #define COM_DESTROY COM_CREATE + 1
- #define COM_DUSER COM_DESTROY + 1
- #define COM_DOPER COM_DUSER + 1
- #define COM_DSERVER COM_DOPER + 1
- #define COM_MEMBERS COM_DSERVER + 1
- #define COM_JOBS COM_MEMBERS + 1
- #define COM_QUEUE COM_JOBS + 1
- #define COM_SERVER COM_QUEUE + 1
-
- COMMAND_ARGS command_args[] =
- /* token, keyword num sig, req. string, req. int */
- {
- {COM_AUSER, "AUSER", 2, TRUE, FALSE},
- {COM_AOPER, "AOPER", 2, TRUE, FALSE},
- {COM_ASERVER, "ASERVER", 2, TRUE, FALSE},
- {COM_CREATE, "CREATE", 1, FALSE, FALSE},
- {COM_DESTROY, "DESTROY", 2, FALSE, FALSE},
- {COM_DUSER, "DUSER", 2, TRUE, FALSE},
- {COM_DOPER, "DOPER", 2, TRUE, FALSE},
- {COM_DSERVER, "DSERVER", 2, TRUE, FALSE},
- {COM_MEMBERS, "MEMBERS", 1, FALSE, FALSE},
- {COM_INFO, "INFO", 1, FALSE, FALSE},
- {COM_QUEUE, "QUEUE", 1, TRUE, FALSE},
- {COM_SERVER, "SERVER", 1, TRUE, FALSE},
- };
- /* Boolean values set by command line options */
- BOOLEAN wantCreateQueue; /* user wants to create queue */
- BOOLEAN wantDestroyQueue; /* user wants to Destroy queue */
- BOOLEAN show_members = FALSE; /* show members of job security groups */
- BOOLEAN show_info = FALSE; /* show jobs in queue */
-
- char *jobQueuePathName = "SYS:SYSTEM"; /* absolute path to job
- queue directory */
- /* define array to be filled with command line arguments */
- char addUserNames [MAX_MOD_USERS][MAX_USER_NAME];
- char deleteUserNames[MAX_MOD_USERS][MAX_USER_NAME];
- int numAddUser;
- int numDeleteUser;
- char addOperNames [MAX_MOD_USERS][MAX_USER_NAME];
- char deleteOperNames[MAX_MOD_USERS][MAX_USER_NAME];
- int numAddOper;
- int numDeleteOper;
- char addServerNames [MAX_MOD_USERS][MAX_USER_NAME];
- char deleteServerNames[MAX_MOD_USERS][MAX_USER_NAME];
- int numAddServer;
- int numDeleteServer;
-
- /* module specific varables and data types */
- /* macro definitions */
-
- /*****************************************************************************/
-
- main(argc,argv,envp)
- /* Descrip:
- This program provides generic job queue maintenance functions.
- Algorithm: //
- Parse and handle command line arguments, initialize defaults
- Execute functionality wished.
- */
- /* Input: */
- int argc;
- char *argv[];
- char *envp[];
-
- { /* main // */
- /*--------------------------------------------------main body */
- if (argc == 1)
- BadUsage(NULL); /* missing command line arguments */
-
- ComAndInit(--argc,++argv,envp); /* skip past program name */
-
- if (wantDestroyQueue)
- {
- DoDestroyQueue();
- exit(0);
- }
- if (wantCreateQueue)
- DoCreateQueue();
- else if (jobQueueID == 0)
- {
- /* all other operations require queueID be found */
- printf("Job queue not found, use /Create option to create, aborting program.\n");
- exit(1);
- }
-
- if (numAddUser OR numDeleteUser)
- DoModUsers();
- if (numAddOper OR numDeleteOper)
- DoModOpers();
- if (numAddServer OR numDeleteServer)
- DoModServers();
-
- if (show_members)
- DoShowMembers();
-
- if (show_info)
- DoShowInfo();
- } /* of main */
-
- /********************************************************************/
-
- BadUsage(message)
- /* Descrip:
- This function is called when a fatal error is detected in the
- command line. It displays the command format and options
- and then exits the program.
- Algorithm: //
- */
- /* Input: */
- char *message; /* optional explanatory message */
- /* Output: */
-
- { /* BadUsage // */
- /*--------------------------------------------------main body */
- if (message)
- printf("Error: %s\n\n",message);
- printf("usage: jsubmit [<command parameters>] <command line>\n\n");
- printf(" /AUser=<user/group name> (max in one command line %d)\n",
- MAX_MOD_USERS);
- printf(" /DUser=<user/group name> (max in one command line %d)\n",
- MAX_MOD_USERS);
- printf(" /AOperator=<user/group name> (max in one command line %d)\n",
- MAX_MOD_USERS);
- printf(" /DOperator=<user/group name> (max in one command line %d)\n",
- MAX_MOD_USERS);
- printf(" /AServer=<user/group name> (max in one command line %d)\n",
- MAX_MOD_USERS);
- printf(" /DServer=<user/group name> (max in one command line %d)\n",
- MAX_MOD_USERS);
- printf(" /Create\n");
- printf(" /DEstroy\n");
- printf(" /Jobs\n");
- printf(" /Members\n");
- printf(" /Queue[=<job queue name>\n");
- printf(" /Server=<target server with job queue>\n");
-
- exit(1);
- } /* end of BadUsage */
-
- /********************************************************************/
-
- ComAndInit(argc,argv,envp)
- /* Descrip:
- This function parses command line input and sets default values.
- Several global variables may be changed from default values by
- command line arguments.
- Algorithm: //
- Scans command line arguments, overiding defaults as needed.
- See top of this file for notes on expected form of command
- line option and badUsage for specific form of commands.
- Saves remote execution command line in jobClientArea.
- Find server of target queue and save in global variable.
- BUGS:
- Not all command line options implemented yet.
- */
- /* Input: */
- int argc;
- char *argv[];
- char *envp[];
- /* Output: */
-
- { /* ComAndInit // */
- /* name of server with job queue */
- char queueServerName[MAX_FSERVER_NAME];
- char argCom[MAX_COM_KEY]; /* command keyword buffer */
- char argString[MAX_ARG_VAR]; /* command argument variable buffer,
- must be static so remains after
- function quits */
- long argInt; /* numeric argument variable */
- JOB_TIME argTime; /* time parameter */
- JOB_DATE argDate; /* date parameter */
- /*--------------------------------------------------main body */
- queueServerName[0] = '\0';
-
- for (;argc; --argc, ++argv)
- {
- if (*argv[0] NOT= '/')
- BadUsage("Unrecognized command line argument");
-
- switch (ScanArg((*argv) + 1,command_args,
- sizeof(command_args)/sizeof(COMMAND_ARGS),
- argString,&argInt,&argTime,&argDate))
- {
- case COM_AUSER: /* add user */
- if (numAddUser == MAX_MOD_USERS)
- printf("Maximum users can be added in one command line are %d, rest ignored.\n",
- MAX_MOD_USERS);
- else
- strncpy(addUserNames[numAddUser++],argString,MAX_USER_NAME);
- break;
- case COM_AOPER: /* add oper */
- if (numAddUser == MAX_MOD_USERS)
- printf("Maximum operators can be added in one command line are %d, rest ignored.\n",
- MAX_MOD_USERS);
- else
- strncpy(addOperNames[numAddOper++],argString,MAX_USER_NAME);
- break;
- case COM_ASERVER: /* add Server */
- if (numAddServer == MAX_MOD_USERS)
- printf("Maximum servers can be added in one command line are %d, rest ignored.\n",
- MAX_MOD_USERS);
- else
- strncpy(addServerNames[numAddServer++],argString,MAX_USER_NAME);
- break;
- case COM_CREATE: /* create queue */
- wantCreateQueue = TRUE;
- break;
- case COM_DESTROY: /* Destroy queue */
- wantDestroyQueue = TRUE;
- break;
- case COM_DUSER: /* add user */
- if (numDeleteUser == MAX_MOD_USERS)
- printf("Maximum users can be deleted in one command line are %d, rest ignored.\n",
- MAX_MOD_USERS);
- else
- strncpy(deleteUserNames[numDeleteUser++],argString,
- MAX_USER_NAME);
- break;
- case COM_DOPER: /* add operator */
- if (numDeleteOper == MAX_MOD_USERS)
- printf("Maximum operators can be deleted in one command line are %d, rest ignored.\n",
- MAX_MOD_USERS);
- else
- strncpy(deleteOperNames[numDeleteOper++],argString,
- MAX_USER_NAME);
- break;
- case COM_DSERVER: /* add servers */
- if (numDeleteServer == MAX_MOD_USERS)
- printf("Maximum servers can be deleted in one command line are %d, rest ignored.\n",
- MAX_MOD_USERS);
- else
- strncpy(deleteServerNames[numDeleteServer++],argString,
- MAX_USER_NAME);
- break;
- case COM_info: /* show queue info */
- show_info = TRUE;
- break;
- case COM_MEMBERS: /* show members of security groups */
- show_members = TRUE;
- break;
- case COM_QUEUE: /* queue name */
- if (strlen(argString) > (MAX_JQUEUE_NAME - 1))
- {
- printf("Job queue name length must be less than %d, aborting\n",
- MAX_JQUEUE_NAME - 1);
- exit(1);
- }
- strcpy(jobQueueName,argString); /* optional job queue name */
- break;
- case COM_SERVER: /* server name */
- if (strlen(argString) > (MAX_FSERVER_NAME - 1))
- {
- printf("Server name length must be less than %d, aborting\n",
- MAX_FSERVER_NAME - 1);
- exit(1);
- }
- strcpy(queueServerName,argString);
- break;
- default:
- printf("Internal error: ComAndInit");
- exit(1);
- } /* end of switch on argCom */
-
- } /* end of for argc loop */
-
- FindJobServer(queueServerName,FALSE);
-
- # if VERB_TEST
- printf("Found server %s, connection ID %x\n",
- queueServerName ? "(default)" : queueServerName,
- jobServerConID);
- # endif
- } /* end of ComAndInit */
-
- /********************************************************************/
-
- DoCreateQueue()
- /* Descrip:
- This function attempts to create job queue as requested by user.
- Algorithm: //
- */
-
- { /* DoCreateQueue // */
- int ccode;
- /*--------------------------------------------------main body */
- if (jobQueueID)
- printf("Job queue specified already exists, can't recreate it.\n");
- /* allow any type of job in queue, no directory handle specified */
- else if (ccode = CreateQueue(jobQueueName,(WORD) OT_JOB_QUEUE,(BYTE) 0,
- jobQueuePathName,&jobQueueID))
- switch (ccode) /* call unsuccessful */
- {
- case INVALID_PATH:
- printf("Could not create queue with path name %s.\n",
- jobQueuePathName);
- exit(1);
- case OBJECT_ALREADY_EXISTS:
- printf("Job queue already exists, could not create it.\n");
- break;
- case INVALID_NAME:
- printf("Job queue name %s is invalid, create failed.\n",
- jobQueueName);
- exit(1);
- case INVALID_BINDERY_SECURITY:
- case NO_OBJECT_CREATE_PRIVILEGE:
- case NO_PROPERTY_CREATE_PRIVILEGE:
- printf("You do not have sufficient security privileges to create\n");
- printf("the job queue, must be supervisor equivalent.\n");
- exit(1);
- case SERVER_BINDERY_LOCKED:
- case BINDERY_FAILURE:
- printf("Could not access bindery because locked or inoperable,\n");
- printf("job queue not created.\n");
- exit(1);
- default:
- printf("Create job queue call to operating system failed, job queue\n");
- printf("not created\n");
- exit(1);
-
- } /* end of switch on ccode */
- else
- printf("Creation of job queue %s successful\n",jobQueueName);
- } /* end of DoCreateQueue */
-
- /********************************************************************/
-
- DoDestroyQueue()
- /* Descrip:
- This function attempts to Destroy a job queue as requested by user.
- Algorithm: //
- */
-
- { /* DoDestroyQueue // */
- int ccode;
- /*--------------------------------------------------main body */
- if (jobQueueID == 0)
- printf("Unable to locate job queue specified to destroy it.\n");
- else if (ccode = DestroyQueue(jobQueueID))
- switch (ccode) /* call unsuccessful */
- {
- case NO_QUEUE:
- printf("Job queue does not exist, could not destroy it.\n");
- break;
- case INVALID_BINDERY_SECURITY:
- case NO_OBJECT_CREATE_PRIVILEGE:
- case NO_PROPERTY_CREATE_PRIVILEGE:
- printf("You do not have sufficient security privileges to destroy\n");
- printf("the job queue, must be supervisor equivalent.\n");
- exit(1);
- case SERVER_BINDERY_LOCKED:
- case BINDERY_FAILURE:
- printf("Could not access bindery because locked or inoperable,\n");
- printf("job queue not destroyed.\n");
- exit(1);
- default:
- printf("Destroy queue call to operating system failed, job queue\n");
- printf("not destroyed.\n");
- exit(1);
-
- } /* end of switch on ccode */
- else
- printf("Job queue %s destroyed.\n",jobQueueName);
- } /* end of DoDestroyQueue */
-
- /********************************************************************/
-
- DoModUsers()
- /* Descrip:
- This routine actually adds ro deletes members of the queue's
- Q_USERS property.
- Will look for user as type OT_USER first, and then OT_GROUP.
- Algorithm: //
- */
- /* Input: */
- /* Output: */
-
- { /* // */
- int ccode;
- reg int i;
- int objectType;
- /*--------------------------------------------------main body */
- for (i = 0; i < numAddUser; ++i)
- {
- if ((objectType = FindUserClassType(addUserNames[i])) < 0)
- continue;
-
- if ((ccode = AddBinderyObjectToSet(jobQueueName,OT_JOB_QUEUE,"Q_USERS",
- addUserNames[i],objectType)) NOT= 0)
- switch (ccode)
- {
- case MEMBER_ALREADY_EXISTS:
- printf("%s already a member of queue user set.\n",addUserNames[i]);
- break;
- case NO_PROPERTY_WRITE_PRIVILEGE:
- goto no_privilege;
- default:
- printf("Unable to add user %s to Q_USERS property of queue.\n",
- addUserNames[i]);
- } /* end of switch ccode */
- }
-
- for (i = 0; i < numDeleteUser; ++i)
- {
- if ((objectType = FindUserClassType(deleteUserNames[i])) < 0)
- continue;
-
- if ((ccode = DeleteBinderyObjectFromSet(jobQueueName,OT_JOB_QUEUE,"Q_USERS",
- deleteUserNames[i],objectType)) NOT= 0)
- switch (ccode)
- {
- case NO_SUCH_MEMBER:
- printf("%s not a member of queue user set.\n",
- deleteUserNames[i]);
- break;
- case NO_PROPERTY_WRITE_PRIVILEGE:
- goto no_privilege;
- default:
- printf("Unable to delete user %s from Q_USERS property of queue.\n",
- deleteUserNames[i]);
- } /* end of switch ccode */
- }
-
- return;
-
- no_privilege: /* abort exit */
- printf("Insufficient security privileges to modify Q_USERS property of queue.\n");
- printf("All user add and delete command line options ignored.\n");
- } /* end of DoModUsers */
-
- /********************************************************************/
-
- int FindUserClassType(objectName)
- /* Descrip:
- This function looks for specified object first as OT_USER type,
- then as OT_GROUP.
- If it fails it returns -1.
- Algorithm: //
- */
- /* Input: */
- char *objectName;
-
- { /* // */
- long objectID;
- /*--------------------------------------------------main body */
- if (GetBinderyObjectID(objectName,OT_USER, &objectID) == 0)
- return(OT_USER);
- if (GetBinderyObjectID(objectName,OT_USER_GROUP,&objectID) == 0)
- return(OT_USER_GROUP);
-
- printf("Unable to find \"%s\" as a user or a group.\n",
- objectName);
- return(-1);
- } /* end of FindUserClassType */
-
- /********************************************************************/
-
- DoModOpers()
- /* Descrip:
- This routine actually adds ro deletes members of the queue's
- Q_OPERATORS property.
- Algorithm: //
- */
- /* Input: */
- /* Output: */
-
- { /* // */
- int ccode;
- reg int i;
- int objectType;
- /*--------------------------------------------------main body */
- for (i = 0; i < numAddOper; ++i)
- {
- if ((objectType = FindUserClassType(addOperNames[i])) < 0)
- continue;
-
- if ((ccode = AddBinderyObjectToSet(jobQueueName,OT_JOB_QUEUE,
- "Q_OPERATORS",addOperNames[i],objectType)) NOT= 0)
- switch (ccode)
- {
- case MEMBER_ALREADY_EXISTS:
- printf("%s already a member of queue operator set.\n",addOperNames[i]);
- break;
- case NO_PROPERTY_WRITE_PRIVILEGE:
- goto no_privilege;
- default:
- printf("Unable to add operator %s to Q_OPERATORS property of queue.\n",
- addOperNames[i]);
- } /* end of switch ccode */
- }
-
- for (i = 0; i < numDeleteOper; ++i)
- {
- if ((objectType = FindUserClassType(deleteOperNames[i])) < 0)
- continue;
-
- if ((ccode = DeleteBinderyObjectFromSet(jobQueueName,OT_JOB_QUEUE,"Q_OPERATORS",
- deleteOperNames[i],objectType)) NOT= 0)
- switch (ccode)
- {
- case NO_SUCH_MEMBER:
- printf("%s not a member of queue operator set.\n",
- deleteOperNames[i]);
- break;
- case NO_PROPERTY_WRITE_PRIVILEGE:
- goto no_privilege;
- default:
- printf("Unable to delete operator %s from Q_OPERATORS property of queue.\n",
- deleteOperNames[i]);
- } /* end of switch ccode */
- }
-
- return;
-
- no_privilege: /* abort exit */
- printf("Insufficient security privileges to modify Q_OPERATORS property of queue.\n");
- printf("All operator add and delete command line options ignored.\n");
- } /* end of DoModOpers */
-
- /********************************************************************/
-
- DoModServers()
- /* Descrip:
- This routine actually adds ro deletes members of the queue's
- Q_SERVERS property.
- Algorithm: //
- */
- /* Input: */
- /* Output: */
-
- { /* // */
- int ccode;
- reg int i;
- int objectType;
- /*--------------------------------------------------main body */
- for (i = 0; i < numAddServer; ++i)
- {
- if ((objectType = FindUserClassType(addServerNames[i])) < 0)
- continue;
-
- if ((ccode = AddBinderyObjectToSet(jobQueueName,OT_JOB_QUEUE,"Q_SERVERS",
- addServerNames[i],objectType)) NOT= 0)
- switch (ccode)
- {
- case MEMBER_ALREADY_EXISTS:
- printf("%s already a member of queue server set.\n",addServerNames[i]);
- break;
- case NO_PROPERTY_WRITE_PRIVILEGE:
- goto no_privilege;
- default:
- printf("Unable to add server %s to Q_SERVERS property of queue.\n",
- addServerNames[i]);
- } /* end of switch ccode */
- }
-
- for (i = 0; i < numDeleteServer; ++i)
- {
- if ((objectType = FindUserClassType(deleteServerNames[i])) < 0)
- continue;
-
- if ((ccode = DeleteBinderyObjectFromSet(jobQueueName,OT_JOB_QUEUE,
- "Q_SERVERS",deleteServerNames[i],objectType)) NOT= 0)
- switch (ccode)
- {
- case NO_SUCH_MEMBER:
- printf("%s not a member of queue server set.\n",
- deleteServerNames[i]);
- break;
- case NO_PROPERTY_WRITE_PRIVILEGE:
- goto no_privilege;
- default:
- printf("Unable to delete server %s from Q_SERVERS property of queue.\n",
- deleteServerNames[i]);
- } /* end of switch ccode */
- }
-
- return;
-
- no_privilege: /* abort exit */
- printf("Insufficient security privileges to modify Q_SERVERS property of queue.\n");
- printf("All server add and delete command line options ignored.\n");
- } /* end of DoModServers */
-
- /********************************************************************/
-
- DoShowMembers()
- /* Descrip:
- This function displays all the members of the current security
- groups.
- Algorithm: //
- */
- /* Input: */
- /* Output: */
-
- { /* // */
- /*--------------------------------------------------main body */
- ShowSetMembers("Q_USERS", "users");
- ShowSetMembers("Q_OPERATORS", "operators");
- ShowSetMembers("Q_SERVERS", "servers");
- printf("\n");
- } /* end of DoShowMembers */
-
- /********************************************************************/
-
- ShowSetMembers(set_name,set_desc)
- /* Descrip:
- Algorithm: //
- */
- /* Input: */
- char *set_name;
- char *set_desc;
-
- { /* // */
- int segmentNumber;
- BOOLEAN foundSegment;
- int ccode;
- long propertyValue[128/sizeof(long)]; /* objectID's of members */
- BYTE moreSegments;
- BYTE propertyFlags;
- reg int ID_index;
- char objectName[MAX_USER_NAME];
- WORD objectType;
- /*--------------------------------------------------main body */
- foundSegment = FALSE;
- printf("Registered queue %s:\n",set_desc);
- for (segmentNumber = 1, moreSegments = TRUE;
- moreSegments;
- ++segmentNumber)
- {
- ccode = ReadPropertyValue(jobQueueName,OT_JOB_QUEUE,set_name,
- segmentNumber,(BYTE *) propertyValue,&moreSegments,
- &propertyFlags);
- if (ccode != 0)
- moreSegments = FALSE;
- else
- {
- foundSegment = TRUE;
- for (ID_index = 0;
- propertyValue[ID_index] != 0 AND ID_index < 128;
- ++ID_index)
- {
- ccode = GetBinderyObjectName(LongSwap(propertyValue[ID_index]),
- objectName,&objectType);
- if (ccode)
- printf(" Bad objectID in %s property.\n",set_name);
- else
- printf(" %s\n",objectName);
- }
- }
- }
- if (foundSegment == FALSE)
- printf(" No registered members\n");
- } /* end of ShowSetMembers */
-
- /********************************************************************/
-
- DoShowInfo()
- /* Descrip:
- Show queue status, attached servers, and jobs in queue.
- */
-
- { /* // */
- /*--------------------------------------------------main body */
- DoShowStatus();
- DoShowAttachedServer();
- DoShowJobs();
- } /* end of DoShowInfo */
-
- /********************************************************************/
-
- DoShowStatus()
- /* Descrip:
- Display current status of queue.
- */
-
- { /* // */
- /*--------------------------------------------------main body */
- } /* end of DoShowStatus */
-
- /********************************************************************/
-
- DoShowAttachedServers()
- /* Descrip:
- Display list of attached servers.
- */
-
- { /* // */
- /*--------------------------------------------------main body */
- } /* end of DoShowAttachedServers */
-
- /********************************************************************/
-
- DoShowJobs()
- /* Descrip:
- This function will display information about all jobs in the
- job queue.
- Algorithm: //
- */
-
- { /* // */
- int ccode;
- int i;
- WORD jobCount;
- WORD jobNumberList[MAX_JOBS];
- JobStruct job;
- /*--------------------------------------------------main body */
- ccode = GetQueueJobList(jobQueueID,&jobCount,jobNumberList,MAX_JOBS);
- if (ccode)
- {
- if (ccode == NO_Q_RIGHTS)
- printf("Insufficient rights to look at jobs in queue\n");
- else
- printf("Unable to get number of jobs in queue\n");
- return;
- }
-
- if (jobCount == 0)
- {
- printf("Job queue empty (no jobs)\n");
- return;
- }
- printf(" Job Job Job DOS\n");
- printf("Number Position Type Command\n");
- printf("------ -------- ---- -------\n");
- for (i = 0; i < jobCount; ++i)
- {
- ccode = ReadQueueJobEntry(jobQueueID,jobNumberList[i],&job);
- if (ccode)
- printf("Internal error: DoShowJobs, ReadQueueJobEntry\n");
- else
- { /* print job structure fields */
- printf(" %2d", job.jobNumber);
- printf(" %2d", job.jobPosition);
- printf(" %2d", job.jobType);
- printf(" %s\n",
- ((CLIENT_REC_AREA *) job.clientRecordArea)->jobCommand);
- } /* end of if ReadQueueJobEntry ccode else */
- } /* end of for i loop */
- printf("\n");
- } /* end of DoShowJobs */
-
- /********************************************************************/